﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using  Box.Entities;

namespace Box.Repository
{
    public class NotaPedidoRepository : MasterRepository, INotaPedidoRepository
    {
        public List<NotaPedido> GetAllFromNotaPedido()
        {
            var query = from p in Context.NotaPedidos
                        
                select p;
            return query.ToList();

        }

        public List<NotaPedido> GetFromNotaPedidoByCriterio(string criteio)
        {
            var query = from p in Context.NotaPedidos
                select p;
            if (criteio!=null&& criteio!=string.Empty)
            {
                query = from p in query
                        where p.ComentarioPedido.ToUpper().Contains(criteio.ToUpper()) ||
                        p.EstadoAlmacen.ToUpper().Contains(criteio.ToUpper())
                    
                    select p;
            }
            return query.ToList();
        }

        public List<NotaPedido> GetFromNotaPedidosByFechas(DateTime fechI, DateTime fechaF)
        {
            var query = from p in Context.NotaPedidos
               where  p.FechaPedido >= fechI && p.FechaPedido <= fechaF
                            select p;

            return query.ToList();


        }

        public NotaPedido GetFromNotaPEdidoById(int id)
        {
            var query = from p in Context.NotaPedidos
                        .Include("DetalleNotaPedido.Producto")
                where p.Id.Equals(id)
                select p;
            return query.SingleOrDefault();
        }

        public void AddNotaPEdido(NotaPedido notaPedido)
        {
            var alamcenEstado = notaPedido.EstadoAlmacen;
            var estadoConfe = notaPedido.EstadoConfeccion;
            var newNota = new NotaPedido()
            {
                FechaPedido = notaPedido.FechaPedido,
                CodigoNotaPedido = notaPedido.CodigoNotaPedido,
                EstadoConfeccion = estadoConfe,
                EstadoAlmacen = alamcenEstado,
                DocumentoPedido = notaPedido.DocumentoPedido,
                 ComentarioPedido = notaPedido.ComentarioPedido,
                Total = notaPedido.Total
            };
            foreach (var item in notaPedido.DetalleNotaPedido)
            {
                var detalle = new DetalleNotaPedido()
                {
                    Cantidad = item.Cantidad,
                    IdProducto = item.IdProducto,
                    PrecioUnit =  item.PrecioUnit,
                    Estado =item.Estado
                    
                };
                newNota.DetalleNotaPedido.Add(detalle);

            }
            Context.NotaPedidos.Add(newNota);
            Context.SaveChanges();
        }

        public void UpdateNotaPedido(NotaPedido notaPedido)
        {
            var notaPedidosDB = GetFromNotaPEdidoById(notaPedido.Id);
            notaPedidosDB.CodigoNotaPedido = notaPedido.CodigoNotaPedido;
            notaPedidosDB.ComentarioPedido = notaPedido.ComentarioPedido;
            notaPedidosDB.DocumentoPedido = notaPedido.DocumentoPedido;
            notaPedidosDB.FechaPedido = notaPedido.FechaPedido;
            notaPedidosDB.EstadoAlmacen = notaPedido.EstadoAlmacen;
            notaPedidosDB.EstadoConfeccion = notaPedido.EstadoConfeccion;
            notaPedidosDB.Total = notaPedido.Total;

            //var estadoDEtalle = Context.ChangeTracker.Entries<DetalleNotaPedido>();
            //Context.Entry(notaPedido.CodigoNotaPedido).State=EntityState.Unchanged;
            ////Context.Entry(notaPedido).State= EntityState.Modified;

            //foreach (var item in notaPedido.DetalleNotaPedido)
            //{
            //    item.IdProducto = item.Producto.Id;
            //    Context.Entry(item.Producto).State= EntityState.Detached;

            ////}

            //var nuevos = notaPedido.DetalleNotaPedido.Except(notaPedidosDB.DetalleNotaPedido).ToList();
            //var eliminados = notaPedidosDB.DetalleNotaPedido.Except(notaPedido.DetalleNotaPedido).ToList();
            //var modificados = notaPedido.DetalleNotaPedido.Intersect(notaPedidosDB.DetalleNotaPedido).ToList();

            //eliminados.ForEach(e => notaPedidosDB.DetalleNotaPedido.Remove(e));

            //nuevos.ForEach(n =>
            //{
            //    Context.Entry(n.Producto).State = EntityState.Unchanged;
            //    notaPedidosDB.DetalleNotaPedido.Add(n);
            //});

            //foreach (var item in modificados)
            //{
            //    var itemDb = notaPedidosDB.DetalleNotaPedido.SingleOrDefault(i => i.IdProducto.Equals(item.IdProducto));

            //    itemDb.PrecioUnit = item.PrecioUnit;
            //    itemDb.Item = item.Item;
                
            //    Context.Entry(itemDb).State = EntityState.Modified;
            //    Context.Entry(itemDb.Producto).State = EntityState.Unchanged;

            //}

            Context.Entry(notaPedidosDB).State = EntityState.Modified;
            Context.SaveChanges();
        }

        public void RemoveNotaPedido(int id)
        {
            var existe = Context.NotaPedidos.Find(id);

            if (existe != null)
            {
                Context.Entry(existe).State= EntityState.Modified;
                existe.Estado = true;
                Context.SaveChanges();
            }
        }


        public List<NotaPedido> GetFromNotaPedidoByCriterioAndAnuladas(string criterio)
        {
            var query = from p in Context.NotaPedidos
                where p.Estado != true 
            
                select p;
            if (criterio!=null && criterio!=string.Empty)
            {
                query = from p in query
                        where p.ComentarioPedido.ToUpper().Contains(criterio.ToUpper())|| p.EstadoAlmacen.ToUpper().Contains(criterio.ToUpper())
                        && p.Estado!=true
                        select p;
            }
            return query.ToList();
        }


        public List<NotaPedido> GetFromNotaPedidoByCriterioActivos(string criterio)
        {
            var query = from p in Context.NotaPedidos
                        where p.Estado != false
                        select p;
            if (criterio != null && criterio != string.Empty)
            {
                query = from p in query
                        where p.ComentarioPedido.ToUpper().Contains(criterio.ToUpper()) || 
                        p.EstadoAlmacen.ToUpper().Contains(criterio.ToUpper()) &&
                        p.Estado!=false
                        select p;
            }
            return query.ToList();
        }


        public IEnumerable<NotaPedido> GetNotaPedidos(string criterio, bool? anulados, bool? todos)
        {
            var query = from p in Context.NotaPedidos
                        select p;

            if (todos.HasValue && anulados.HasValue)
            {
                if (!todos.Value)
                {
                    query = from p in query
                            where p.Estado == anulados.Value
                            select p;
                }
                
            }

            if (!string.IsNullOrEmpty(criterio))
            {
                query = from p in query
                        where p.ComentarioPedido.ToUpper().Contains(criterio.ToUpper()) ||
                        p.EstadoAlmacen.ToUpper().Contains(criterio.ToUpper())

                        select p;
            }
            return query;
        }
    }
}
